/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import javax.swing.JFrame;

/**
 *
 * @author Bruno Vicente
 */
public class Desenho extends JFrame{

    //Variaveis auxiliares
    private ArrayList<String> esquerdos;
    private ArrayList<String> direitos;
    private boolean lado;

    private HashMap<String, Object> vertices;
    private mxGraph grafico = new mxGraph();
    private Object elemento = grafico.getDefaultParent();
    mxGraphComponent ComponenteGrafico = new mxGraphComponent(grafico);

    public Desenho(){
        super("GRAFO DA REDE");
        setBounds(5,100,850,680);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getContentPane().add(ComponenteGrafico);
        vertices = new HashMap<String, Object>();
        esquerdos = new ArrayList<String>();
        direitos = new ArrayList<String>();
        lado = false;
        this.setLocationRelativeTo(null);
    }

    public void Desenha(String[][] grafo){
        Random randominco = new Random();

        for(int i=1;i<grafo.length;i++){
            int altura = randominco.nextInt(550);
            int largura = randominco.nextInt(750);
            Object ver = grafico.insertVertex(elemento, null, grafo[0][i], largura, altura, 30, 20,"defaultVertex");
            vertices.put(grafo[0][i], ver);
        }
    }

    public void RefazJanela(){
        getContentPane().remove(ComponenteGrafico);
        grafico = new mxGraph();
        elemento = grafico.getDefaultParent();
        ComponenteGrafico = new mxGraphComponent(grafico);
        getContentPane().add(ComponenteGrafico);
    }

    /**
     * Cria um enlace entre dois nós
     * @param inicio: nó inicial do enlace.
     * @param fim: nó final do enlace
     * @param peso: peso do enlace na rede.
     */
    public void setEnlace(String inicio, String fim, String peso){
        Object estado = vertices.get(inicio);
        Object vizinho = vertices.get(fim);
        grafico.insertEdge(elemento, null, peso, estado, vizinho);
        grafico.insertEdge(elemento, null, peso, vizinho, estado);
    }

    /**
     * Cria um vértice na tela.
     * @param nome: nome do vértice criado.
     * @param tipo: Tipo de vertice: true - Roteador | False - Host
     * @param caminho: Nós que estão sendo visitados
     */
    public void setDesenhoVertice(String nome, boolean tipo,ArrayList<String> caminho){
        Object ver = null;
        int altura,largura;
        Random randominco = new Random();

        if(tipo == false){//SE TRUE - Rotedor E FALSE - Host
            if(lado == true){
                largura = randominco.nextInt(700);
                if(largura < 100){
                    largura += 400;
                }else{
                    if(largura >= 100 && largura <= 400){
                        largura += 300;
                    }
                }
                altura = randominco.nextInt(600);
                lado = false;
                direitos.add(nome);
            }else{//Fim do IF do Lado
                largura = randominco.nextInt(400);
                if(largura <= 100)
                    largura += 150;
                altura = randominco.nextInt(600);
                lado = true;
                esquerdos.add(nome);
            }//Fim do ELSE do Lado
            if(caminho.contains(nome))
                ver = grafico.insertVertex(elemento, null, nome, largura, altura, 30, 20,"defaultVertex;fillColor=green");
            else
                ver = grafico.insertVertex(elemento, null, nome, largura, altura, 30, 20,"defaultVertex");
            vertices.put(nome, ver);
        }else{//É UM HOST
            if(this.getLado(nome) == false){
                largura = randominco.nextInt(90);
                altura = randominco.nextInt(600);
            }else{
                largura = randominco.nextInt(800);
                if(largura <= 700){
                    int x = 700-largura;
                    largura += (x+50);
                }
                altura = randominco.nextInt(600);
            }//Fim do Else do Lado
            if(caminho.contains(nome))
                ver = grafico.insertVertex(elemento, null, nome, largura, altura, 30, 20,"defaultVertex;fillColor=green");
            else
                ver = grafico.insertVertex(elemento, null, nome, largura, altura, 30, 20,"defaultVertex;fillColor=red");
            vertices.put(nome, ver);
        }
    }//Fim da função

    private boolean getLado(String host){
        boolean achou = false;
        boolean since = false;
        String computador = String.valueOf(host.charAt(0));
        for(int i=0;i<esquerdos.size();i++){
            if(esquerdos.get(i).equals(computador)){
                since = false;
                achou = true;
                break;
            }
        }
        if(achou == false)
        for(int i=0;i<direitos.size();i++){
            if(direitos.get(i).equals(computador)){
                since = true;
                break;
            }
        }
        return since;
    }//Fim do getLado

    /**
     * Cria o desenho da rede completamente
     * @param roteadores
     * @param hosts
     * @param caminho
     */
    public void cria_desenho_rede(String[][] roteadores, String[][] hosts,ArrayList<String> caminho){

        for(int i=1;i<roteadores.length;i++){
             this.setDesenhoVertice(roteadores[0][i], false,caminho);
        }//Fim do For maior

        for(int i=1;i<roteadores.length;i++){
            for(int j=1;j<roteadores.length;j++){
                if((roteadores[i][j] != null)&&(roteadores[i][j] != "")){
                    this.setEnlace(roteadores[i][0], roteadores[0][j], roteadores[i][j]);
                    roteadores[j][i] = "";
                }
            }
        }

        for(int i=0;i<hosts.length;i++){
            this.setDesenhoVertice(hosts[i][1]+""+hosts[i][0], true,caminho);
            this.setEnlace(hosts[i][1], hosts[i][1]+""+hosts[i][0], "");
        }


    }//Fim do gera_desenho_rede

}
